import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @author WGG
 * @create 2023-05-27 15:31
 */
public class ThreadTest1 {
    public static void main(String[] args) {
        /**
         * 并行：多个线程 同时执行
         * 并发：多个线程 切换执行 由于CPU切换效率比较高 感觉像是 并行
         */
        //创建线程的三种方式
//        //1.继承 Tread 类
//        MyThread t1 = new MyThread();
//        //如果执行start方法就是产生并发状态 会在main线程和t1线程之间来回切换
//        t1.start();
//        //如果执行run方法就是先执行t1线程,后执行mian 线程
////        t1.run();

//        //2.实现runnable接口
//        Thread t2 = new Thread(()->{
//            for (int i = 0; i < 1000; i++) {
//                System.out.println("实现Runnable接口重写run方法："+i);
//            }
//        });
//        t2.start();
//        for (int i = 0; i < 1000; i++) {
//            System.out.println("main线程:"+i);
//        }

//        //3.callable接口
        //创建callable的实现类
        MyCallable myCallable = new MyCallable();
        //创建 FutureTask 类
        FutureTask futureTask = new FutureTask<>(myCallable);
        //由于FutureTask实现了runnable接口 可以直接传入线程对象
        Thread t3 = new Thread(futureTask);
        //启动线程
        t3.start();
        //执行一些其他操作
        //其他操作结束后 回来看返回的结果
        try {
            Object o = futureTask.get();
            System.out.println("实现callable接口，实现call方法 返回的结果是："+o);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    }
}
class MyCallable implements Callable{

    @Override
    public Object call() throws Exception {
        int count = 0;
        for (int i = 0; i < 100; i++) {
            count += i;
        }
        return count;
    }
}

class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("1.继承thread类，实现"+i);
        }
    }
}